/*
 * @Author: Jae Frank[thissfk@qq.com]
 * @Date: 2024-01
 * @LastEditors: Jae Frank[thissfk@qq.com]
 * @LastEditTime: 2024-04
 * @FilePath: zf_driver_gpio.h
 * JaeFrank\ForFun\SmartCar\SchoolGame\cyt4887_-free-rtos_-template\libraries\zf_driver\zf_driver_gpio.h
 * @Description:
 *            If you need more information,
 * please contact Jae Frank[thissfk@qq.com] to get an access.
 * Copyright (c) 2024 by Jae Frank, All Rights Reserved.
 */
/*********************************************************************************************************************
 * CYT4BB Opensourec Library 即（ CYT4BB 开源库）是一个基于官方 SDK
 *接口的第三方开源库 Copyright (c) 2022 SEEKFREE 逐飞科技
 *
 * 本文件是 CYT4BB 开源库的一部分
 *
 * CYT4BB 开源库 是免费软件
 * 您可以根据自由软件基金会发布的 GPL（GNU General Public License，即
 *GNU通用公共许可证）的条款 即 GPL 的第3版（即
 *GPL3.0）或（您选择的）任何后来的版本，重新发布和/或修改它
 *
 * 本开源库的发布是希望它能发挥作用，但并未对其作任何的保证
 * 甚至没有隐含的适销性或适合特定用途的保证
 * 更多细节请参见 GPL
 *
 * 您应该在收到本开源库的同时收到一份 GPL 的副本
 * 如果没有，请参阅<https://www.gnu.org/licenses/>
 *
 * 额外注明：
 * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt
 *文件中 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明（即本声明）
 *
 * 文件名称          zf_driver_gpio
 * 公司名称          成都逐飞科技有限公司
 * 版本信息          查看 libraries/doc 文件夹内 version 文件 版本说明
 * 开发环境          IAR 9.40.1
 * 适用平台          CYT4BB
 * 店铺链接          https://seekfree.taobao.com/
 *
 * 修改记录
 * 日期              作者                备注
 * 2024-1-4       pudding            first version
 ********************************************************************************************************************/

#ifndef _zf_driver_gpio_h_
#define _zf_driver_gpio_h_

#include "zf_common_typedef.h"

typedef enum // 枚举端口
{
  // 在设置IO时请自行根据硬件确认当前芯片是否具有此IO
  // 以下引脚在本枚举中仅作为占位使用，实际核心板并没有以下引脚
  // P14_2, P14_3, P21_0, P21_1, P21_2, P21_3, P21_4, P22_0, P22_1, P22_2,
  // P23_2, P23_5, P23_6

  P00_0 = 0 * 8,
  P00_1,
  P00_2,
  P00_3,

  P01_0 = 1 * 8,
  P01_1,

  P02_0 = 2 * 8,
  P02_1,
  P02_2,
  P02_3,
  P02_4,

  P03_0 = 3 * 8,
  P03_1,
  P03_2,
  P03_3,
  P03_4,

  P04_0 = 4 * 8,
  P04_1,

  P05_0 = 5 * 8,
  P05_1,
  P05_2,
  P05_3,
  P05_4,

  P06_0 = 6 * 8,
  P06_1,
  P06_2,
  P06_3,
  P06_4,
  P06_5,
  P06_6,
  P06_7,

  P07_0 = 7 * 8,
  P07_1,
  P07_2,
  P07_3,
  P07_4,
  P07_5,
  P07_6,
  P07_7,

  P08_0 = 8 * 8,
  P08_1,
  P08_2,
  P08_3,

  P09_0 = 9 * 8,
  P09_1,

  P10_0 = 10 * 8,
  P10_1,
  P10_2,
  P10_3,
  P10_4,

  P11_0 = 11 * 8,
  P11_1,
  P11_2,

  P12_0 = 12 * 8,
  P12_1,
  P12_2,
  P12_3,
  P12_4,
  P12_5,

  P13_0 = 13 * 8,
  P13_1,
  P13_2,
  P13_3,
  P13_4,
  P13_5,
  P13_6,
  P13_7,

  P14_0 = 14 * 8,
  P14_1,
  P14_2,
  P14_3,
  P14_4,
  P14_5,

  P15_0 = 15 * 8,
  P15_1,
  P15_2,
  P15_3,

  P17_0 = 17 * 8,
  P17_1,
  P17_2,
  P17_3,
  P17_4,

  P18_0 = 18 * 8,
  P18_1,
  P18_2,
  P18_3,
  P18_4,
  P18_5,
  P18_6,
  P18_7,

  P19_0 = 19 * 8,
  P19_1,
  P19_2,
  P19_3,
  P19_4,

  P20_0 = 20 * 8,
  P20_1,
  P20_2,
  P20_3,

  P21_0 = 21 * 8,
  P21_1,
  P21_2,
  P21_3,
  P21_4,
  P21_5,
  P21_6,

  P22_0 = 22 * 8,
  P22_1,
  P22_2,
  P22_3,
  P22_4,
  P22_5,
  P22_6,

  P23_0 = 23 * 8,
  P23_1,
  P23_2,
  P23_3,
  P23_4,
  P23_5,
  P23_6,
  P23_7,

  NC,
} gpio_pin_enum;

typedef enum // 枚举端口方向    此枚举定义不允许用户修改
{ GPI = 0,   // 定义管脚输入方向
  GPO = 1,   // 定义管脚输出方向
} gpio_dir_enum;

typedef enum     // 枚举端口电平    此枚举定义不允许用户修改
{ GPIO_LOW = 0,  // 定义低电平
  GPIO_HIGH = 1, // 定义高电平
} gpio_level_enum;

typedef enum       // 枚举端口模式   此枚举定义不允许用户修改
{ GPI_FLOATING_IN, // 定义管脚浮空输入
  GPI_PULL_UP,     // 定义管脚上拉输入
  GPI_PULL_DOWN,   // 定义管脚下拉输入

  GPO_PUSH_PULL,  // 定义管脚推挽输出
  GPO_OPEN_DTAIN, // 定义管脚开漏输出
} gpio_mode_enum;

//====================================================GPIO
// 快捷函数====================================================
#define get_port(pin)                                                          \
  ((volatile stc_GPIO_PRT_t *)&GPIO->PRT[(((uint8)pin) >> 3U)])
#define get_port_in_addr(pin)                                                  \
  ((uint32)(((uint8)(((uint8)pin) >> 3U)) * 0x80) + 0x40310000UL +             \
   0x10) // port * 单组引脚内存 + GPIO寄存器起始地址 + GPIO_IN寄存器偏移地址
#define get_port_out_addr(pin)                                                 \
  ((uint32)(((uint8)(((uint8)pin) >> 3U)) * 0x80) +                            \
   0x40310000UL) // port * 单组引脚内存 + GPIO寄存器起始地址 +
                 // GPIO_IN寄存器偏移地址
//------------------------------------------------------------------------------------------------------------------
// 函数简介     对应 IO 置位为高电平
// 参数说明     x           选择的引脚 (可选择范围由 zf_driver_gpio.h 内
// gpio_pin_enum 枚举值确定) 返回参数     void 使用示例     gpio_high(P00_0);//
// P00_0 输出高电平 备注信息	该函数直接对寄存器操作
//------------------------------------------------------------------------------------------------------------------
#define gpio_high(x)                                                           \
  ((*(volatile uint32_t *)(0x40310000UL +                                      \
                           (0x80 * ((uint8_t)(((uint8_t)(x)) >> 3U))) +        \
                           0x08)) =                                            \
       (0x01 << ((uint8_t)(((uint8_t)x) & 0x07U)))) // GPIO置位

//------------------------------------------------------------------------------------------------------------------
// 函数简介     对应 IO 置位为低电平
// 参数说明     x           选择的引脚 (可选择范围由 zf_driver_gpio.h 内
// gpio_pin_enum 枚举值确定) 返回参数     void 使用示例     gpio_low(P00_0);//
// P00_0 输出低电平 备注信息     该函数直接对寄存器操作
//------------------------------------------------------------------------------------------------------------------
#define gpio_low(x)                                                            \
  ((*(volatile uint32_t *)(0x40310000UL +                                      \
                           (0x80 * ((uint8_t)(((uint8_t)(x)) >> 3U))) +        \
                           0x04)) =                                            \
       (0x01 << ((uint8_t)(((uint8_t)x) & 0x07U)))) // GPIO复位

//====================================================GPIO
// 快捷函数====================================================

//====================================================GPIO
// 基础函数====================================================
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
void gpio_set_level(gpio_pin_enum pin, uint8 dat);
uint8 gpio_get_level(gpio_pin_enum pin);
void gpio_toggle_level(gpio_pin_enum pin);
void gpio_set_dir(gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum pinconf);
void gpio_init(gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat,
               gpio_mode_enum pinconf);
#ifdef __cplusplus
}
#endif // __cplusplus
//====================================================GPIO
// 基础函数====================================================

#endif
